Prisma|Reusing & Composing GraphQL APIs with GraphQL Bindings
使用 GraphQL binding,不需要了解细节问题,可以访问到 GraphQL API 的功能
什么是GraphQL bindings?
graphql binding是构建的模块,可以让你在自己的 GraphQL Server中嵌入已经村啊在的 GraphQL APIS 像是搭积木的块.
创建一个 GraphQL API binding的核心思想是提供一个专用的(dedicated)对象,来代表 API 的功能. 这个对象暴露的方法是 GraphQL schema中定义查询的镜像.
不需要在手动构建查询字符串,然后发送到 API(通过fetch
或者 GraphQL客户端,例如graphql-request
),只需要使用特定程序语言”构建”查询,调用查询方法即可.
在使用 typed 语言时, GraphQL binding 会把 GraphQL API 的 type 映射到对应的编程语言上.
GraphQL最具威力的地方就是它的强类型 schema. 然而通过字符串发送查询时, 优势就没有了. Binding可以让我们重新获取这一优势
GraphQL binding 最简单的例子
假设有如下的 schema:
1 | type Query { |
现在,在使用 binding 和这个 schema 交互时,不需要构建查询字符串. 只需要在对象helloWroldBinding
对象上调用 代表hello
查询的函数即可:
1 | helloWorldBinding.query.hello() |
调用函数时,对象的查询会被发送到 API:
1 | # helloWorldBinding.query.hello() |
使用 GraphQL binding 的好处
简化和抽象 API
对IDE的支持
可重用
边编译边做错误检查
语言通用性
构建和共享 GraphQL bindings
使用graphql-binding
package
这个包的核心是一个
Binding
类,这个类接收 Graphql shcema 作为构造参数.
这个例子比较简单,实际使用中 schema 需要是远程的 schemas
1 | const { makeExecutableSchema } = require('graphql-tools') |
上面是创建 schema 的过程,有了 schema 就可以创建Binding
实例了:
1 | const findUserBinding = new Binding({ |
最后就可以使用 binding 对象findUserBinding
来访问 schema 的findUser
查询:
1 | findUserBinding.query.findUser({name:'Bob'}) |
为 GraphQL bidings 生成静态类型
使用 GraphQL CLI 生成 TS 类型
GraphQL CLI 包含有graphql prepare
命令,可以轻松生成静态类型
第一步添加静态类型生成
1 | projects: |
schemaPaht
:指向 GraphQL schema.extensions.prepare-binding.output
: 存放生成的 bindingsextensions.prepare-binding.generator
: generator 使用的地方.. 存在的 generator:binding-js
&binding-ts
可以用于任何的 GraphQL API.prisma-js
&prisma-ts
为Prisma 服务提供额外的便利性
假设你的schema 位于shcema.graphql
,你可以调用graphql prepare
命令生成 TypeScript bindings. 放置在generated/helloworls.ts
:
1 | import { Binding as BaseBinding, BindingOptions } from 'graphql-binding' |
这个文件不能手动修改.
新型的ORM: GraphQL database bindings
GraphQL bindings 可以在 database layer 和 application layer 之间生成映射. 在上下文中,可以在 server 中扮演 ORM的角色
例如,使用 Prisma 作为 graphql database layer.你可以直接使用prisma-binding
,或者使用prisma-ts
生成静态类型
一下是prisma-binding
的工作.假设有一个简单的 data model
1 | type User{ |
在部署以后,会自动生成 Prisma database schema. 这个 schema 定义了 User
类型的 CURD 操作.
1 | type Query { |
现在可以实例化Prisma
类,
1 | const { Prisma } = require('prisma-binding') |
prisma
实例现在作为 query,mutations和 subscription的代理. 实例如下:
1 | // Retrieve `name` of a specific user |
实际新版的 prisma 就是这个思路.
==完==